#include "seg.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

void Seg_DisA(void);
void Seg_DisV(void);

void Seg_DisA(void)
{
    Seg_DisSegment((u8)DISVAL_A & (u8)DISVAL_B & (u8)DISVAL_C & (u8)DISVAL_F & (u8)DISVAL_E & (u8)DISVAL_G);
}

void Seg_DisV(void)
{
    Seg_DisSegment((u8)DISVAL_F & (u8)DISVAL_E & (u8)DISVAL_D & (u8)DISVAL_C & (u8)DISVAL_B);
}

void Seg_Init(void)
{
    GPIO_Init(SCK_PORT, SCK_PIN, GPIO_MODE_OUT_PP_LOW_FAST);
    GPIO_Init(RCK_PORT, RCK_PIN, GPIO_MODE_OUT_PP_LOW_FAST);
    GPIO_Init(SIN_PORT, SIN_PIN, GPIO_MODE_OUT_PP_HIGH_FAST);

    GPIO_Init(SEG1_PORT, SEG1_PIN, GPIO_MODE_OUT_PP_HIGH_FAST);
    GPIO_Init(SEG2_PORT, SEG2_PIN, GPIO_MODE_OUT_PP_HIGH_FAST);
    GPIO_Init(SEG3_PORT, SEG3_PIN, GPIO_MODE_OUT_PP_HIGH_FAST);
    GPIO_Init(SEG4_PORT, SEG4_PIN, GPIO_MODE_OUT_PP_HIGH_FAST);

    OPEN_SEG1();
    OPEN_SEG2();
    OPEN_SEG3();
    OPEN_SEG4();
}

void Seg_DisSegment(u8 seg)
{
    u8 i;
    for (i = 0; i < 8; i++)
    {
        if (seg & 0x01 == 1)
        {
            SIN_HIGH();
            SCK_RISING();
        }
        else
        {
            SIN_LOW();
            SCK_RISING();
        }
        seg >>= 1;
    }
    RCK_RISING();
}

void Seg_DisNum(u8 num)
{
    if (num == 0)
    {
        Seg_DisSegment((u8)DISVAL_F & (u8)DISVAL_E & (u8)DISVAL_D & (u8)DISVAL_C & (u8)DISVAL_B & (u8)DISVAL_A);
    }
    else if (num == 1)
    {
        Seg_DisSegment((u8)DISVAL_C & (u8)DISVAL_B);
    }
    else if (num == 2)
    {
        Seg_DisSegment((u8)DISVAL_E & (u8)DISVAL_D & (u8)DISVAL_G & (u8)DISVAL_B & (u8)DISVAL_A);
    }
    else if (num == 3)
    {
        Seg_DisSegment((u8)DISVAL_D & (u8)DISVAL_C & (u8)DISVAL_B & (u8)DISVAL_A & (u8)DISVAL_G);
    }
    else if (num == 4)
    {
        Seg_DisSegment((u8)DISVAL_F & (u8)DISVAL_G & (u8)DISVAL_B & (u8)DISVAL_C);
    }
    else if (num == 5)
    {
        Seg_DisSegment((u8)DISVAL_F & (u8)DISVAL_A & (u8)DISVAL_G & (u8)DISVAL_C & (u8)DISVAL_D);
    }
    else if (num == 6)
    {
        Seg_DisSegment((u8)DISVAL_G & (u8)DISVAL_F & (u8)DISVAL_E & (u8)DISVAL_D & (u8)DISVAL_C & (u8)DISVAL_E & (u8)DISVAL_A);
    }
    else if (num == 7)
    {
        Seg_DisSegment((u8)DISVAL_C & (u8)DISVAL_B & (u8)DISVAL_A);
    }
    else if (num == 8)
    {
        Seg_DisSegment((u8)DISVAL_G & (u8)DISVAL_F & (u8)DISVAL_E & (u8)DISVAL_D & (u8)DISVAL_C & (u8)DISVAL_B & (u8)DISVAL_A);
    }
    else if (num == 9)
    {
        Seg_DisSegment((u8)DISVAL_G & (u8)DISVAL_F & (u8)DISVAL_C & (u8)DISVAL_B & (u8)DISVAL_A);
    }
}

void Seg_DisNumAndDp(u8 num)
{
    if (num == 0)
    {
        Seg_DisSegment((u8)DISVAL_F & (u8)DISVAL_E & (u8)DISVAL_D & (u8)DISVAL_C & (u8)DISVAL_B & (u8)DISVAL_A & (u8)DISVAL_DP);
    }
    else if (num == 1)
    {
        Seg_DisSegment((u8)DISVAL_C & (u8)DISVAL_B & (u8)DISVAL_DP);
    }
    else if (num == 2)
    {
        Seg_DisSegment((u8)DISVAL_E & (u8)DISVAL_D & (u8)DISVAL_G & (u8)DISVAL_B & (u8)DISVAL_A & (u8)DISVAL_DP);
    }
    else if (num == 3)
    {
        Seg_DisSegment((u8)DISVAL_D & (u8)DISVAL_C & (u8)DISVAL_B & (u8)DISVAL_A & (u8)DISVAL_G & (u8)DISVAL_DP);
    }
    else if (num == 4)
    {
        Seg_DisSegment((u8)DISVAL_F & (u8)DISVAL_G & (u8)DISVAL_B & (u8)DISVAL_C & (u8)DISVAL_DP);
    }
    else if (num == 5)
    {
        Seg_DisSegment((u8)DISVAL_F & (u8)DISVAL_A & (u8)DISVAL_G & (u8)DISVAL_C & (u8)DISVAL_D & (u8)DISVAL_DP);
    }
    else if (num == 6)
    {
        Seg_DisSegment((u8)DISVAL_G & (u8)DISVAL_F & (u8)DISVAL_E & (u8)DISVAL_D & (u8)DISVAL_C & (u8)DISVAL_E & (u8)DISVAL_A & (u8)DISVAL_DP);
    }
    else if (num == 7)
    {
        Seg_DisSegment((u8)DISVAL_C & (u8)DISVAL_B & (u8)DISVAL_A & (u8)DISVAL_DP);
    }
    else if (num == 8)
    {
        Seg_DisSegment((u8)DISVAL_G & (u8)DISVAL_F & (u8)DISVAL_E & (u8)DISVAL_D & (u8)DISVAL_C & (u8)DISVAL_B & (u8)DISVAL_A & (u8)DISVAL_DP);
    }
    else if (num == 9)
    {
        Seg_DisSegment((u8)DISVAL_G & (u8)DISVAL_F & (u8)DISVAL_C & (u8)DISVAL_B & (u8)DISVAL_A & (u8)DISVAL_DP);
    }
    //{if} čĄ¨ç¤ş DP
    else if (num == 10)
    {
        Seg_DisSegment((u8)DISVAL_DP);
    }
}

void Seg_DisValueScan(u16 value)
{
    //@ ćˇťĺ ć­¤ć ĺżä˝ĺŻĺŽç°ďźćŻćŹĄčżĺĽć­¤ĺ˝ć°ćśďźĺŞćŤć1ä¸Şć°ç çŽĄäťĽçĄŽäżćŻä¸Şć°ç çŽĄçćŤććśé´ç¸ďż?    //.. ĺŚććŻä˝ć°ç çŽĄçćŤććśé´ä¸ĺďźĺ°ąäźĺŻźč´ć°ç çŽĄçćžç¤şäşŽĺşŚä¸ďż?    static u8 temp = 0;
    static u8 temp = 0;
    if (temp == 0)
    {
        if (value >= 0)
        {
            Seg_DisSegment(DISVAL_NONE);
            DIS_SEG4(); //ĺźĺŻçŹŹ1ä˝ć°ç çŽĄćžç¤ş
            if (!system.disModel)
            {
                Seg_DisV();
            }
            else
            {
                Seg_DisA();
            }
            // Seg_DisNum(value % 10);
        }
    }
    else if (temp == 1)
    {
        if (value >= 10)
        {
            Seg_DisSegment(DISVAL_NONE);
            DIS_SEG3(); //ĺźĺŻçŹŹ2ä˝ć°ç çŽĄćžç¤ş
            //@ ćžç¤şć°ĺ­ĺćśćžç¤şĺ°ć°ďż?
            Seg_DisNum(value / 10 % 10);       
        }
    }
    else if (temp == 2)
    {
        // if ((value / 100 % 10) > 0)
        if (value >= 100)
        {
            Seg_DisSegment(DISVAL_NONE);
            DIS_SEG2(); //ĺźĺŻçŹŹ3ä˝ć°ç çŽĄćžç¤ş

            // Seg_DisNum(value / 100 % 10);

            if (!system.disModel)
            {
                Seg_DisNum(value / 100 % 10);
            }
            else
            {
                Seg_DisNumAndDp(value / 100 % 10);
            } 
        }
    }
    else if (temp == 3)
    {
        // if ((value / 1000 % 10) > 0)
        if (value >= 1000)
        {
            Seg_DisSegment(DISVAL_NONE);
            DIS_SEG1(); //ĺźĺŻçŹŹ4ä˝ć°ç çŽĄćžç¤ş
            Seg_DisNum(value / 1000 % 10);
        }
    }

    temp++;
    if (value < 10)
    {
        if (temp >= 1)
            temp = 0;
    }
    else if (value < 100 && value >= 10)
    {
        if (temp >= 2)
            temp = 0;
    }
    else if (value < 1000 && value >= 100)
    {
        if (temp >= 3)
            temp = 0;
    }
    else if (value >= 1000)
    {
        if (temp >= 4)
            temp = 0;
    }
    // if (++temp >= num)
    //     temp = 0;
}

void Seg_DisErrNumScan(FAIL_NUMBER err)
{
    static u8 cycleVal = 0;
    //{if} ĺˇć°çŹ?ä˝ć°ç çŽĄ
    if (cycleVal == 0)
    {
        Seg_DisSegment(DISVAL_NONE);
        DIS_SEG1(); //ĺźĺŻçŹŹ1ä˝ć°ç çŽĄćžç¤ş
        Seg_DisSegment((u8)DISVAL_A & (u8)DISVAL_F & (u8)DISVAL_G & (u8)DISVAL_E & (u8)DISVAL_D);
    }
    //{if} ĺˇć°çŹ?ä˝ć°ç çŽĄ
    else if (cycleVal == 1)
    {
        Seg_DisSegment(DISVAL_NONE);
        DIS_SEG2(); //ĺźĺŻçŹŹ1ä˝ć°ç çŽĄćžç¤ş
        Seg_DisSegment((u8)DISVAL_F & (u8)DISVAL_E & (u8)DISVAL_G);
    }
    //{if} ĺˇć°çŹ?ä˝ć°ç çŽĄ
    else if (cycleVal == 2)
    {
        Seg_DisSegment(DISVAL_NONE);
        DIS_SEG3(); //ĺźĺŻçŹŹ1ä˝ć°ç çŽĄćžç¤ş
        Seg_DisSegment((u8)DISVAL_F & (u8)DISVAL_E & (u8)DISVAL_G);
    }
    cycleVal++;
    if (cycleVal > 2)
        cycleVal = 0;
    //{else} ĺˇć°çŹ?ä˝ć°ç çŽĄ
    // else if (cycleVal == 3)
    // {
    //     Seg_DisSegment((u8)DISVAL_NONE);
    //     DIS_SEG1(); //ĺźĺŻçŹŹ1ä˝ć°ç çŽĄćžç¤ş
    //     if (err == ERR_ANY){}
    //     else if (err == ERR_01)
    //         Seg_DisNum(1);
    //     else if (err == ERR_02)
    //         Seg_DisNum(2);
    //     else if (err == ERR_03)
    //         Seg_DisNum(3);
    //     else if (err == ERR_04)
    //         Seg_DisNum(4);
    //     else if (err == ERR_05)
    //         Seg_DisNum(5);

    //     cycleVal = 0;
    // }
}
void Seg_Test(void)
{
    //.. ćľčŻćŻä¸ä¸ŞćŽľ   Seg_DisSegment(DISVAL_NONE);
    //    Seg_DisSegment(DISVAL_DP);
    //    Seg_DisSegment(DISVAL_G);
    //    Seg_DisSegment(DISVAL_F);
    //    Seg_DisSegment(DISVAL_E);
    //    Seg_DisSegment(DISVAL_D);
    //    Seg_DisSegment(DISVAL_C);
    //    Seg_DisSegment(DISVAL_B);
    //    Seg_DisSegment(DISVAL_A);

    //.. ćľčŻćŽľç ć°ĺ­ćžç¤ş
    // u8 i;
    // for (i = 0; i < 11; i++)
    // {
    //     Seg_DisNum(i);
    //     DelayMs(500);
    // }

    //.. ćľčŻć°ç çŽĄć´ä˝ćžďż?
}

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
